package view;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import util.Banquinho;
import util.Console;
import controller.CrudCliente;
import controller.CrudProdutos;
import controller.CrudVenda;
import entites.Cliente;
import entites.Produto;
import entites.Venda;

public class InterfaceUsuario {
	Scanner sc = new Scanner(System.in);

	private CrudProdutos repositorioProdutos;

	public InterfaceUsuario() {
		repositorioProdutos = new CrudProdutos();
		repositorioProdutos.iniciaProdutos();
	}

	public void executar() {
	    String nomeArquivo = "meubanquinho.txt";
	    File file = new File(nomeArquivo);
	    Banquinho zas = Banquinho.getInstance();
	    if (file.exists()) {
	        try
	        {
	           FileInputStream fileIn = new FileInputStream(nomeArquivo);
	           ObjectInputStream in = new ObjectInputStream(fileIn);
	           zas.setInstance((Banquinho) in.readObject());
	           in.close();
	           fileIn.close();
	        }catch(IOException i)
	        {
	           i.printStackTrace();
	           return;
	        }catch(ClassNotFoundException c)
	        {
	           c.printStackTrace();
	           return;
	        }
	    }
		int opcao = 0;
		do {
			System.out.println(Menu.getOpcoes());
			opcao = Console.scanInt("Digite sua op��o:");
			switch (opcao) {
			case Menu.OP_CADASTRAR_PRODUTO:
				cadastrarProduto();
				break;
			case Menu.OP_LISTAR_PRODUTOS:
				listarProdutos();
				break;
			case Menu.OP_ATUALIZAR_PRODUTO:
				atualizarProduto();
				break;
			case Menu.OP_REMOVER_PRODUTO:
				removerProduto();
				break;
			case Menu.OP_COMPRAR_PRODUTO:
				cadastraVenda();
				break;
			case Menu.OP_VISUALIZAR_VENDA:
				visualizarVenda();
				break;
			case Menu.OP_SAIR:
			      try
			      {
			         zas = Banquinho.getInstance();
			         FileOutputStream fileOut = new FileOutputStream(nomeArquivo);
			         ObjectOutputStream out = new ObjectOutputStream(fileOut);
			         out.writeObject(zas);
			         out.close();
			          fileOut.close();
			      }catch(IOException i)
			      {
			          i.printStackTrace();
			      }
			    
				System.out.println("[Aplica��o finalizada!!!]");
				break;
			default:
				System.out.println("Op��o inv�lida!");
			}
		} while (opcao != Menu.OP_SAIR);
	}

	private void exibeMensagem(String msg) {
		System.out.println(msg);
		System.out
				.println("Para continuar pressione qualquer tecla e pressione enter");
		sc.next();
	}

	private void cadastrarProduto() {
		System.out.println("-----------------------------\n");
		String codigo = Console.scanString("Digite o c�digo:");
		if (!repositorioProdutos.produtoExiste(codigo)) {
			String nome = Console.scanString("Digite o nome:");
			String tipo = Console.scanString("Digite a plataforma:");
			float preco = Console.scanFloat("Digite o pre�o:");
			repositorioProdutos.addProduto(new Produto(codigo, nome, tipo,
					preco));
			System.out.println("Produto cadastrado com sucesso!");
		} else
			System.out.println("C�digo j� existente!");
	}

	private void listarProdutos() {
		System.out.println(Menu.getOpcoesOrdenacao());
		int opcao = Console.scanInt("Digite a op��o:");
		List<Produto> produtos = null;

		if (opcao == Menu.OPLISTAR_SEMORDENACAO)
			produtos = repositorioProdutos.getAllProdutos();
		else if (opcao == Menu.OPLISTAR_ORDEMCODIGO)
			produtos = repositorioProdutos.getAllOrdenadosPorCodigo();
		else if (opcao == Menu.OPLISTAR_ORDEMNOME)
			produtos = repositorioProdutos.getAllOrdenadosPorNome();
		else if (opcao == Menu.OPLISTAR_ORDEMPLATAFORMA)
			produtos = repositorioProdutos.getAllOrdenadosPorTipo();
		else if (opcao == Menu.OPLISTAR_ORDEMPRECO)
			produtos = repositorioProdutos.getAllOrdenadosPorPreco();
		else {
			System.out.println("Op��o inv�lida");
			return;
		}
		System.out.println("-----------------------------\n");
		System.out.println(String.format("%-10s", "C�DIGO") + "\t"
				+ String.format("%-20s", "|NOME") + "\t"
				+ String.format("%-20s", "|PLATAFORMA") + "\t"
				+ String.format("%-10s", "|PRE�O"));
		for (Produto produto : produtos) {
			System.out.println(String.format("%-10s", produto.getCodigo())
					+ "\t" + String.format("%-20s", "|" + produto.getNome())
					+ "\t" + String.format("%-20s", "|" + produto.getTipo())
					+ "\t" + String.format("%-10s", "|" + produto.getPreco()));
		}

	}

	private void atualizarProduto() {
		System.out.println("-----------------------------\n");
		String codigo = Console.scanString("Digite o c�digo:");
		Produto produto = repositorioProdutos.buscarProduto(codigo);
		if (produto != null) {
			System.out.println("-----------------------------\n");
			System.out.println("Codigo: " + produto.getCodigo());
			System.out.println("Codigo: " + produto.getNome());
			System.out.println("Codigo: " + produto.getTipo());
			System.out.println("Codigo: " + produto.getPreco());
			System.out.println("-----------------------------\n");
			float preco = Console.scanFloat("Digite o pre�o:");
			produto.setPreco(preco);
			System.out.println("Pre�o atualizado com sucesso!!");
		} else
			System.out.println("Produto n�o encontrado!!");
	}

	private void removerProduto() {
		System.out.println("-----------------------------\n");
		String codigo = Console.scanString("Digite o c�digo:");
		Produto produto = repositorioProdutos.buscarProduto(codigo);
		if (produto != null) {
			repositorioProdutos.removeProduto(produto);
			System.out.println("Produto removido com sucesso!!");
		} else
			System.out.println("Produto n�o encontrado!!");

	}

	public boolean cadastraVenda() {
		Cliente cli;
		Produto prod;
		List<Venda> carrinho = new ArrayList<Venda>();
		Venda item;
		int parseInt;
		System.out.println("==========");
		try {
			System.out.println("Digite c�digo do cliente:");
			cli = CrudCliente.search(Integer.parseInt(sc.next()));
			if (cli == null) {
				throw new Exception("Cliente invalido");
			}
			while (true) {
				System.out
						.println("Digite o codigo do produto ou 0 para terminar as compras");
				parseInt = Integer.parseInt(sc.next());
				if (parseInt == 0) {
					break;
				}
				prod = CrudProdutos.search(toString());
				if (prod == null) {
					throw new Exception("Produto invalido");
				}
				item = new Venda();
				item.setMatricula(cli.getCod());

				carrinho.add(item);
				exibeMensagem("Item adicionado no carrinho");
			}
			if (carrinho.size() > 0) {
				if (CrudVenda.save(carrinho)) {
					exibeMensagem("Compras realizada com sucesso");
					return true;
				} else {
					exibeMensagem("Falha ao realizar as compras");
				}
			} else {
				exibeMensagem("Nenhuma compra realizada");
			}
		} catch (NumberFormatException e) {
			exibeMensagem("O campo aceita apenas dado numerico");
		} catch (Exception e) {
			exibeMensagem(e.getMessage());
		}
		return false;
	}

	public void visualizarVenda() {
		List<Venda> vendas = CrudVenda.getVendas();
		System.out.println(String.format("%-20s", "CDVENDA") + "\t"
				+ String.format("%-20s", "NRSEQUENCIA") + "\t"
				+ String.format("%-20s", "MATRICULA") + "\t"
				+ String.format("%-20s", "CODIGO VENDA") + "\t"
				+ String.format("%-20s", "SUBTOTAL"));
		for (Venda venda : vendas) {
			System.out.println(String.format("%-20s", venda.getCdvenda())
					+ "\t" + String.format("%-20s", venda.getNrsequencia())
					+ "\t" + String.format("%-20s", venda.getMatricula())
					+ "\t" + String.format("%-20s", venda.getCodigo()) + "\t"
					+ String.format("%-20s", venda.getSubTotal()));
		}
		exibeMensagem("Listagem concluida");
	}
}